package com.zdp.filesync.configuration;

import com.alibaba.nacos.api.config.ConfigType;
import com.alibaba.nacos.api.config.annotation.NacosConfigListener;
import com.zdp.filesync.config.client.FileSyncClient;
import com.zdp.filesync.config.client.FileSyncClientConfig;
import com.zdp.filesync.monitor.config.FileMonitorConfig;
import com.zdp.filesync.config.server.FileSyncServer;
import com.zdp.filesync.config.server.FileSyncServerConfig;
import com.zdp.filesync.monitor.service.FileMonitorService;
import com.zdp.filesync.nacos.service.NacosApi;
import com.zdp.filesync.nacos.service.NacosService;
import com.zdp.filesync.nacos.service.impl.NacosServiceImpl;
import com.zdp.filesync.rsync.service.RsyncConfigRefresh;
import com.zdp.filesync.utils.SpringContextUtils;
import com.zdp.filesync.utils.YamlUtil;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.InitializingBean;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

import java.util.Objects;

@Configuration
@Slf4j
public class NacosConfiguration implements InitializingBean {

    @Autowired
    private FileSyncClient fileSyncClient;

    @Autowired
    private FileMonitorConfig fileMonitorConfig;

    @Autowired
    private FileMonitorService fileMonitorService;

    @Autowired
    private RsyncConfigRefresh rsyncConfigRefresh;

    @Autowired
    private NacosService nacosService;

    /**
     * 监听 客户端配置 （客户端监听的文件路径）
     * @param yamlStr
     */
    @NacosConfigListener(dataId = "${file-sync-server.nacos.data-ids[0]}",type = ConfigType.YAML)
    public void onReceive(String yamlStr){

        FileSyncClientConfig config = YamlUtil.toObject(yamlStr, FileSyncClientConfig.class);
        // 更新 fileSyncClient
        if(Objects.nonNull(config)){
            // 通知客户端初始化文件更新
            nacosService.refreshServerConfig(config);
            fileSyncClient.copy(config.getFileSyncClient());
        }else{
            // 输出日志
            log.warn("配置转换失败，配置自动同步失败");
        }
    }

    /**
     * 监听服务端 配置文件更新 （主要监听 文件目录的更新）
     * @param yamlStr
     */
    @NacosConfigListener(dataId = "${file-sync-server.nacos.data-ids[1]}",type = ConfigType.YAML)
    public void onReceiveServerConfig(String yamlStr){
        FileSyncServerConfig config = YamlUtil.toObject(yamlStr, FileSyncServerConfig.class);
        if(Objects.nonNull(config)){
            //更新数据，同时更新任务
            fileMonitorService.refreshMonitorTask(config.getFileMonitorConfig());
            // 更新 Rsync配置，并重启服务
            if(Objects.isNull(rsyncConfigRefresh)){
                SpringContextUtils.context.getBean(RsyncConfigRefresh.class).refreshRsyncConfig(config.getFileMonitorConfig());
            }else{
                rsyncConfigRefresh.refreshRsyncConfig(config.getFileMonitorConfig());
            }
            // 更新配置对象
            fileMonitorConfig.copy(config.getFileMonitorConfig());
        }else{
            log.warn("配置转化失败，配置自动同步失败2");
        }
    }


    @Override
    public void afterPropertiesSet() throws Exception {
        // 初始化服务端配置 ---> 提供一个配置文件，用于接收客户端的注册信息
        nacosService.initServer();
        // 通知客户端初始化文件目录
        nacosService.refreshServerConfig(null);
    }
}
